#include <iostream>
#include <string.h>

using namespace std;

class String
{
public:
    String()
    :_pstr(new char[1]())
    {}

    String(const char *pstr)
    :_pstr(new char[strlen(pstr)+1]())
    {
        strcpy(_pstr,pstr);
    }

    String(const String &rhs)
    :_pstr(new char[strlen(rhs._pstr)+1]())
    {
        strcpy(_pstr,rhs._pstr);
    }

    String &operator=(const String &rhs){
        if(&rhs!=this){
            delete[] _pstr;
            _pstr=new char[strlen(rhs._pstr)+1]();
            strcpy(_pstr,rhs._pstr);
        }
        return *this;
    }

    ~String(){
        if(_pstr){
            delete[] _pstr;
            _pstr=nullptr;
        }
    }

    bool empty() const{
        return strlen(_pstr)==0;
    }

    int size() const{
        return strlen(_pstr);
    }

    const char *c_str() const{
        return _pstr;
    }

    const char *data() const{
        return _pstr;
    }

    String &append(String &rhs){
        if(rhs.size()!=0){
            char *temp=new char[strlen(_pstr)+strlen(rhs._pstr)+1]();
            strcpy(temp,_pstr);
            strcat(temp,rhs._pstr);
            delete[] _pstr;
            _pstr=temp;
        }
        return *this;
    }

    String &append(const char *pstr){
        String temp(pstr);
        return append(temp);
    }

private:
    char *_pstr;
};

void test(){
    String s="hello";
    String s2("world");
    String s3=s2;

    cout << s3.c_str() << endl;
}

int main()
{
    test();
    return 0;
}

